package cn.gwm.flink.streaming.beans.trip;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
import org.apache.hadoop.hbase.TableName;

import java.math.BigDecimal;
import java.sql.Timestamp;

/**
 * @author byh
 */
@Data
public class CarTripOutput {
    /**
     * 总行程
     */
    public static final String TOTAL_TRIP = "vaas_dwm:DWM_TRIP_TOTAL_EV_0306";
    public static TableName TOTAL_TABLE_NAME = TableName.valueOf(CarTripOutput.TOTAL_TRIP);
    /**
     * 小行程
     */
    public static final String PART_TRIP = "vaas_dwm:DWM_TRIP_PART_EV_0306";

    public static TableName PART_TABLE_NAME = TableName.valueOf(CarTripOutput.PART_TRIP);
    /**
     * 间歇行程
     */
    public static final String PAUSE_TRIP = "vaas_dwm:DWM_TRIP_PAUSE_EV_0306";
    public static TableName PAUSE_TABLE_NAME = TableName.valueOf(CarTripOutput.PAUSE_TRIP);
    private String deviceId;
    private Long item_time;
    /**
     * 平均车速
     */
    private Double avgvehspd;
    /**
     * 总行程
     * 小行程
     */
    private String triptype;
    /**
     * 行程日期
     */
    private String tripstartdate;
    /**
     * 车型
     */
    private String vehicletype;
    /**
     * 最大时间间隔
     */
    private String maxduration;
    /**
     * 行程序号
     */
    private Integer tripno;
    /**
     * 上低压时间
     */
    private String startlowvoltagetime;
    /**
     * 上高压时间
     */
    private String starthighvoltagetime;
    /**
     * 行程开始时间
     */
    private String tripstarttime;
    /**
     * 开始SOC
     */
    private Double startbmssoc;
    /**
     * 开始SOE
     */
    private Double startbmssoe;
    /**
     * 开始SOH车端计算
     */
    private Double startbmssoh;
    /**
     * 开始SOH云端计算
     */
    private Double startbmssoh1;
    /**
     * 开始电池最低温度
     */
    private Integer startbmsmoduletempmin;
    /**
     * 开始电池最高温度
     */
    private Integer startbmsmoduletempmax;
    /**
     * 开始电池平均温度
     */
    private Integer startbmsmoduletempaverage;
    /**
     * 开始环境温度
     */
    private Integer startat;
    /**
     * 开始车内温度
     */
    private Double startincartemp;
    /**
     * 开始里程表
     */
    private Double startipvehtotdistance;
    /**
     * 开始副驾有人
     */
    private Integer startpassspersts;
    /**
     * 开始后排中座有人
     */
    private Integer startsecrowmidspersts;
    /**
     * 开始时后排右位是否有人
     */
    private Integer startsecrowrspersts;
    /**
     * 开始时后排左位是否有人
     */
    private Integer startsecrowlspersts;
    /**
     * 开始时乘客数
     */
    private Integer startpeoples;
    /**
     * 结束SOC
     */
    private Double endbmssoc;
    /**
     * 结束SOE
     */
    private Double endbmssoe;
    /**
     * 结束SOH车端计算
     */
    private Double endbmssoh;
    /**
     * 结束SOH云端计算
     */
    private Double endbmssoh1;
    /**
     * 结束电池最低温度
     */
    private Integer endbmsmoduletempmin;
    /**
     * 结束电池最高温度
     */
    private Integer endbmsmoduletempmax;
    /**
     * 结束电池平均温度
     */
    private Integer endbmsmoduletempaverage;
    /**
     * 结束环境温度
     */
    private Integer endat;
    /**
     * 结束车内温度
     */
    private Double endincartemp;
    /**
     * 结束里程表
     */
    private Double endipvehtotdistance;
    /**
     * 结束副驾有人
     */
    private Integer endpassspersts;
    /**
     * 结束后排中座有人
     */
    private Integer endsecrowmidspersts;
    /**
     * 结束时后排右位是否有人
     */
    private Integer endsecrowrspersts;
    /**
     * 结束时后排左位是否有人
     */
    private Integer endsecrowlspersts;
    /**
     * 结束时乘客数
     */
    private Integer endpeoples;
    /**
     * 开始位经度
     */
    private BigDecimal startlongitude;
    /**
     * 开始时纬度
     */
    private BigDecimal startlatitude;
    /**
     * 开始省市
     */
    private String startarea;
    /**
     * 开始行程poi
     */
    private String startpoi;
    /**
     * 行程结束时间
     */
    private String tripendtime;
    /**
     * 下低压时间
     */
    private String endlowvoltagetime;
    /**
     * 下高压时间
     */
    private String endhighvoltagetime;

    /**
     * 结束位经度
     */
    private BigDecimal endlongitude;
    /**
     * 结束时纬度
     */
    private BigDecimal endlatitude;
    /**
     * 结束省市
     */
    private String endarea;
    /**
     * 结束行程poi
     */
    private String endpoi;
    /**
     * 行程范围
     */
    private int travelrange;
    /**
     * 总里程
     */
    private Double ipvehtotdistance;
    /**
     * 持续时间
     */
    private String tripduration;
    /**
     * 车型四码
     */
    private String model_code;
    /**
     * 软件版本
     */
    private String bms_swversion;

    /**
     * 行程用到的经纬度是否有效
     */
    private String gpsflag;

    /**
     * 行程完整性 0：完成 1：稳态后数据丢失 2：开始稳态阶段速度大于等于2，且里程比上次结束大于等于2km 3：空行程，上下高压里程差大于等于2km
     */
    private String tripflag;

    public CarTripOutput(String tripType) {
        this.triptype = tripType;
    }

    public CarTripOutput() {
    }

    public static CarTripOutput calculationAverageSpeed(CarTripOutput carTripOutput) {
        if (ObjectUtil.isNotEmpty(carTripOutput.getTripduration())  && ObjectUtil.isNotEmpty(carTripOutput.getIpvehtotdistance())) {
            long duration = Convert.toLong(carTripOutput.getTripduration());
            if (duration == 0) {
                duration = 1;
            }
            //便于计算km/h
            Double Ipvehtotdistancevalue =carTripOutput.getIpvehtotdistance()*3600;
            carTripOutput.setAvgvehspd(NumberUtil.div(Ipvehtotdistancevalue, Convert.toDouble(duration)));
        }
        return carTripOutput;
    }

    public static CarTripOutput convertDecimalFormat(CarTripOutput carTripOutput) {
        if (ObjectUtil.isNotEmpty(carTripOutput.getIpvehtotdistance())) {
            carTripOutput.setIpvehtotdistance(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getIpvehtotdistance())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getStartipvehtotdistance())) {
            carTripOutput.setStartipvehtotdistance(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getStartipvehtotdistance())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getStartincartemp())) {
            carTripOutput.setStartincartemp(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getStartincartemp())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getStartbmssoc())) {
            carTripOutput.setStartbmssoc(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getStartbmssoc())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getStartbmssoe())) {
            carTripOutput.setStartbmssoe(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getStartbmssoe())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getStartbmssoh())) {
            carTripOutput.setStartbmssoh(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getStartbmssoh())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getEndincartemp())) {
            carTripOutput.setEndincartemp(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getEndincartemp())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getEndbmssoe())) {
            carTripOutput.setEndbmssoe(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getEndbmssoe())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getEndbmssoc())) {
            carTripOutput.setEndbmssoc(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getEndbmssoc())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getEndbmssoh())) {
            carTripOutput.setEndbmssoh(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getEndbmssoh())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getEndipvehtotdistance())) {
            carTripOutput.setEndipvehtotdistance(Convert.toDouble(NumberUtil.decimalFormat("#.##", carTripOutput.getEndipvehtotdistance())));
        }
        if (ObjectUtil.isNotEmpty(carTripOutput.getAvgvehspd())) {
            carTripOutput.setAvgvehspd(Convert.toDouble(NumberUtil.round(carTripOutput.getAvgvehspd(),3)));
        }
        return carTripOutput;
    }

}
